//消息模块：负责处理用户消息的发送和接收
//send_message：发送消息到服务器。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "message.h"
#include <sys/socket.h>
#include <unistd.h>
#include "config.h"
#include <stdbool.h>

int in_private_mode = 0;    // 私聊模式标志，0 表示不在私聊模式，1 表示在私聊模式
char private_target[USERNAME_LEN];    // 私聊目标用户名

/**
 *  发送消息到服务器，根据不同模式处理群聊和私聊消息。
 * 
 * 该函数会根据当前是否处于私聊模式，以及用户输入的消息内容，
 * 决定将消息以私聊或群聊的形式发送到服务器。同时，还能处理退出私聊和进入私聊的逻辑。
 * 
 *   sockfd 与服务器通信的套接字文件描述符。
 *   msg 要发送的消息内容，以 null 结尾的字符串。
 */
void send_message(int sockfd, const char *msg) {
    // 退出私聊逻辑：若当前处于私聊模式且用户输入 /exit 命令，则退出私聊模式
    if (strcmp(msg, "/exit") == 0 && in_private_mode) {
        // 向服务器发送 /exit 命令
        send(sockfd, msg, strlen(msg), 0);
        // 关闭私聊模式
        in_private_mode = 0;
        return;
    }

    // 私聊逻辑：若当前处于私聊模式，将消息包装成私聊消息发送
    if (in_private_mode) {
        // 用于存储包装后的私聊消息
        char private_msg[BUFFER_SIZE * 2];
        // 构造私聊消息，格式为 "@目标用户名 消息内容"
        //snprintf：将格式化的数据写入字符串中
        //sizeof(private_msg)：目标字符串的最大长度，确保不会超出数组范围
        //@%s %s：格式化字符串，%s 表示字符串占位符，分别对应 private_target 和 msg
        //private_target：私聊目标用户名，%s 会被替换为实际的用户名
        //msg：要发送的消息内容，%s 会被替换为实际的消息内容
        snprintf(private_msg, sizeof(private_msg), "@%s %s", private_target, msg);

        // 向服务器发送私聊消息
        send(sockfd, private_msg, strlen(private_msg), 0);
    } else {
        // 普通群聊：若不处于私聊模式，直接将消息作为群聊消息发送
        send(sockfd, msg, strlen(msg), 0);
        
        // 检查私聊请求：若消息以 @ 开头，尝试解析目标用户名并进入私聊模式
        if (msg[0] == '@') {
            // 用于存储解析出的目标用户名
            char target[USERNAME_LEN];
            // 从消息中解析目标用户名，最多读取 49 个字符
            if (sscanf(msg,"@%49s", target) == 1) {
                // 开启私聊模式
                in_private_mode = 1;
                // 记录私聊目标用户名
                strcpy(private_target, target);
            }
        }
    }
}
